package server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

// TODO 可以改成多线程

/**
 * @Description: BIO + 线程池
 * @Author: ggb
 * @Date: 2021/1/14
 * @Version: 1.1
 */
public class MiniTomcat {

    private int count;

    public void runServer(int port) throws IOException {
        ServerSocket server = new ServerSocket(port);
        count = 0;
        System.out.println("服务器启动，监听" + port);
        // 为什么是这个newCachedThreadPool 这个是底层是SynchronousQueue 不存储元素（甚至一个都没有）
        //  选用 newFixedThreadPool 怎么确定线程数量 N个处理器的系统上
        // 如果是IO密集型应用，则线程池大小设置为2N+1
        // CPU密集型任务 尽量使用较小的线程池，一般为CPU核心数+1
        // 最佳线程数目 = （（线程等待时间+线程CPU时间）/线程CPU时间 ）* CPU数目
        ExecutorService pool = new ThreadPoolExecutor(9, 9,
                60L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());

        // TODO 为啥不直接用true
        while (!Thread.interrupted()) {
            Socket client = server.accept();
//            System.out.println("我接收到socket了！");
            pool.execute(new TomcatThread(client));
        }
        server.close();
    }
}
